
package rpc;

import java.*;
import java.io.UnsupportedEncodingException;
import java.net.*;
import javax.xml.crypto.Data;

/**
 * Datagrama basico :P $NF$M$NFS$RESP$D$D$D$... 
 * NF	=IDENTIFICADOR DE FUNCION DE CLIENTE peticion de servicio 
 * M 	=NUMERO DE PARAMETROS 
 * NFS  =IDENTIFICADOR DE FUNCION EN EL SERVER 
 * RESP = respuesta a la funcion 
 * D	=DATOS A ENVIAR
 * */

enum fu {
	SUM, MUL, MODULO,POTENCIA,DIV_ENTERA, ACUMULADOR
};//este enum es algo provisorio el servidor dispone de 6  servicios

public class Stub {
    
        private String Nom_Service;
	private String Datagram;
	private String resp;
	private String[] arg;
	private int indServer;
	public int ind;

	/*
	 * Contructor con parametro String que contiene el nombre de la funcion a
	 * pedir al servidor
	 */

	public Stub(String func, Object... param) {
		Datagram = "";
		ind = fu.valueOf(func).ordinal();
		Datagram += "$" + ind + "$" +ind+"$"+ param.length + "$";

		for (int y = 0; y < param.length; y++) {
			Datagram += param[y];
			Datagram += "$";
		}

		Nom_Service = func;
	}

	public Stub(byte[] b) throws UnsupportedEncodingException {
		Nom_Service = new String(b, "UTF8");
	}

	/*
	 * 
	 * */
	public void print() {
		System.out.println(Nom_Service);
	}

	/*
	 * funcion que decodifica el flujo de bytes recibidos por rpc cliente como
	 * respuesta
	 */
	public Object Decryp() {
		int y = resp.length() - 2;
		while (resp.charAt(y) != '$') {
			y--;
		}
		
		//resp = resp.substring(y + 1, resp.length() - 1);
		resp = resp.substring(y + 1, resp.length());
		int valor = Integer.parseInt(resp);

		return valor;
	}

	/*
	 * funcion que envia un string en forma de bytes a rpc cliente
	 */

	public Object Encryp() throws UnsupportedEncodingException {

		byte[] r = Datagram.getBytes("UTF8");
		return r;

	}

	@SuppressWarnings("static-access")
	public boolean verifique(String arg) {// espera al RPCcliente
		return false;// para ver si la funcion esta disponible
	}

	public Object getResult() {
		// $NF$M$NFS
		//Datagram = new StringBuffer(Datagram).insert(3, " $").toString();
		RpcClient clien=new RpcClient();
		resp=clien.comunicar(Datagram);
		//resp = "$12$12$1$123$";
		return Decryp();
	}

	public String getDatagrama() {
		return Datagram;
	}

	public void setDatagrama(String str){
		Datagram=str;
		
	}

	public void printDatagrama() {
		System.out.println(Datagram);
	}

	//Funcion de prueba de clase
	public static void main(String args[]) throws UnsupportedEncodingException {
		//byte[] bite = ed.getBytes("UTF8");
		int y = 20;
		Stub prueba = new Stub("MUL", 6, y);
		prueba.printDatagrama();
		System.out.println(prueba.getResult());
				
	}
    
}
